#! /usr/bin/env node
const path = require('path')
const fs = require('fs')
const { program } = require('commander') // 建命令行接口的流行库，帮助解析命令行参数
const packageConfig = require('../package.json')
const sourceMap = require('source-map')

// 读取文件信息
const readFile = (filePath) => new Promise((resolve, reject) => {
  fs.readFile(filePath, { encoding: 'utf-8' }, (err, data) => {
    if (err) reject(err)
    else resolve(data.toString())
  })
})

// 定义命令行参数
program.version(packageConfig.version)  // --version 版本
  .requiredOption('-p, --source-path <sourcePath>', 'source-map文件地址')
  .requiredOption('-l, --line <line>', '设置错误所在行')
  .requiredOption('-c, --column <col>', '设置错误所在列')
  .description('source-map 解析工具')
  .action(async (options) => { // 当命令行工具被执行时，接收解析后的命令行参数并执行异步操作。
    // {
    //   source: 'webpack:///src/components/exam_mg/order_mg_list.vue',
    //   line: 754,
    //   column: 0,
    //   name: 'a'
    // }
    console.log(options)
    const sourcePath = path.resolve(process.cwd(), options.sourcePath)
    const line = Number(options.line)
    const column = Number(options.column)

     // 读取传入地址的source map文件
    const sourceMapFileContent = await readFile(sourcePath)
    const sourceMapContent = JSON.parse(sourceMapFileContent)
    // 根据source map内容生成SourceMapConsumer实例
    const consumer = await new sourceMap.SourceMapConsumer(sourceMapContent);

    // 根据传入的打包后错误位置解析出源码错误位置信息
    const originalPosition = consumer.originalPositionFor({
      line,
      column
    })

    consumer.destroy()
    // 打印源码错误位置信息
    // {
    //   source: 'webpack:///src/components/exam_mg/order_mg_list.vue',
    //   line: 754,
    //   column: 0,
    //   name: 'a'
    // }
    console.log(originalPosition)
     // 能获取到源码内容（前提打包的时候不要加nosources）
    // const sourceContent = consumer.sourceContentFor(originalPosition.source);
    // console.log(sourceContent)

  })

program.parse(process.argv) // 解析命令行参数并执行对应的命令。

/* 输出
[
  '/Users/jame/.nvm/versions/node/v18.15.0/bin/node',
  '/Users/jame/.nvm/versions/node/v18.15.0/bin/smc',
  '-p',
  './chunk-66974dc7.97029c6e.js',
  '-l',
  '1',
  '-c',
  '31815'
]
*/
console.log(process.argv)


// 执行：smc -p ./chunk-66974dc7.97029c6e.js -l 1 -c 31815